package util;

import java.util.ArrayList;
import java.util.List;

public class StringUtils {
	
	/**
	 * Deze methode splitst de string in stukken.
	 * Lege stukken worden weggegooid.
	 * 
	 * @param	string
	 * @param	delimiter
	 * 
	 * @return
	 * 
	 * @throws	NullPointerException
	 * 			string == null
	 */
	public String[] split(String string, char delimiter)
	{
		StringBuilder huidig = new StringBuilder();
		List<String> strings = new ArrayList<String>();
		
		for(int i = 0; i<string.length(); i++)
		{
			char c = string.charAt(i);
			
			if(c == delimiter)
			{
				if(huidig.length() != 0)
				{
					strings.add(huidig.toString());
					huidig = new StringBuilder();
				}
			}
			else
			{
				huidig.append(c);
			}
		}
		
		if(huidig.length() != 0)
		{
			strings.add(huidig.toString());
		}
		
		String[] f = new String[strings.size()];
		f = strings.toArray(f);
		return f;
	}
	

	/**
	 * Maakt van een string een Coordinaat.
	 * 
	 * @param	string
	 * @return
	 * 
	 * @throws	IllegalArgumentException
	 * 			string kan niet in 2 stukken gesplitst worden.
	 * @throws	NumberFormatException
	 * 			Kan geen nummers parsen.
	 * @throws	NullPointerException
	 * 			string == null
	 */
	public Coordinaat parseCoordinaat(String string)
	{
		String[] stukken = split(string, ',');
		
		if(stukken.length != 2)
			throw new IllegalArgumentException();
		
		int x = Integer.parseInt(stukken[0]);
		int y = Integer.parseInt(stukken[1]);
		
		return new Coordinaat(x, y);
	}
	
	
	/**
	 * Maakt van een string een Boolean.
	 * 0 = true, 1 = false, 2 = null.
	 * 
	 * @throws	NumberFormatException
	 * 			string != 0, 1 of 2.
	 * @throws	NullPointerException
	 * 			string == null
	 */
	public Boolean parseBoolean(String string)
	{
		if(string == null)
			throw new NullPointerException();
		
		int i = Integer.parseInt(string);
		
		if(i == 0)
			return false;
		if(i == 1)
			return true;
		if(i == 2)
			return null;
		
		throw new NumberFormatException();
	}
	
	/**
	 * Zet een boolean om naar een string.
	 * 
	 * @see StringUtils#parseBoolean(String)
	 */
	public String booleanToString(Boolean bool)
	{
		if(bool == null)
			return "2";
		if(bool == true)
			return "1";
		if(bool == false)
			return "0";
		
		throw new RuntimeException();
	}
	
	private final static WindRichting[] richtingArrayVolgensProtocol =
		{
			null,
			WindRichting.ZUID,
			WindRichting.WEST,
			WindRichting.NOORD,
			WindRichting.OOST
		};
	
	public WindRichting intToWindrichting(int richting)
	{
		if(richting < 1 || richting > 4)
			return null;
		
		return richtingArrayVolgensProtocol[richting];
	}
	
	public String windrichtingToString(WindRichting windrichting)
	{
		for(int i = 1; i <= 4; i++)
		{
			if(richtingArrayVolgensProtocol[i] == windrichting)
				return "" + i;
		}
		
		return null;
	}
	
	public String coordinaatToString(Coordinaat coordinaat)
	{
		return coordinaat.getX() + "," + coordinaat.getY();
	}
	
	
}
